package org.hamcrest.generator.config;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasItem;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import junit.framework.TestCase;
import org.hamcrest.Factory;
import org.hamcrest.Matcher;
import org.hamcrest.core.CombinableMatcher;
import org.hamcrest.generator.FactoryMethod;
import org.hamcrest.generator.FactoryWriter;
import org.hamcrest.generator.SugarConfiguration;
import org.xml.sax.InputSource;
public class XmlConfiguratorTest extends TestCase {
private MockSugarConfiguration sugarConfiguration;
private XmlConfigurator config;
@Override
protected void setUp() throws Exception {
super.setUp();
sugarConfiguration = new MockSugarConfiguration();
config = new XmlConfigurator(sugarConfiguration, getClass().getClassLoader());
}
public void testAddsMatcherFactoryMethodsToConfiguration() throws Exception {
config.load(createXml("" +
"<matchers>" +
" <factory class='org.hamcrest.generator.config.XmlConfiguratorTest$SomeMatcher'/>" +
" <factory class='org.hamcrest.generator.config.XmlConfiguratorTest$AnotherMatcher'/>" +
"</matchers>"));
assertThat(sugarConfiguration.factoryMethods(),
hasItem(new FactoryMethod(SomeMatcher.class.getName(), "matcher1", "org.hamcrest.Matcher")));
assertThat(sugarConfiguration.factoryMethods(),
hasItem(new FactoryMethod(SomeMatcher.class.getName(), "matcher2", "org.hamcrest.Matcher")));
assertThat(sugarConfiguration.factoryMethods(),
hasItem(new FactoryMethod(AnotherMatcher.class.getName(), "matcher3", "org.hamcrest.CombinableMatcher")));
}
private InputSource createXml(String xml) {
return new InputSource(new StringReader(xml));
}
// Sample Matchers
@SuppressWarnings("unchecked")
public static class SomeMatcher {
@Factory
public static Matcher matcher1() {
return null;
}
@Factory
public static Matcher matcher2() {
return null;
}
}
@SuppressWarnings("unchecked")
public static class AnotherMatcher {
@Factory
public static CombinableMatcher matcher3() {
return null;
}
}
/**
* Simple 'record and check' style mock. Not using a mocking library to avoid
* cyclical dependency between mocking library and hamcrest.
*/
private static class MockSugarConfiguration implements SugarConfiguration {
private final List<FactoryMethod> seenFactoryMethods = new ArrayList<FactoryMethod>();
private final List<FactoryWriter> seenFactoryWriters = new ArrayList<FactoryWriter>();
public void addWriter(FactoryWriter factoryWriter) {
seenFactoryWriters.add(factoryWriter);
}
public void addFactoryMethod(FactoryMethod method) {
seenFactoryMethods.add(method);
}
public void addFactoryMethods(Iterable<FactoryMethod> methods) {
for (FactoryMethod method : methods) {
addFactoryMethod(method);
}
}
public List<FactoryMethod> factoryMethods() {
return seenFactoryMethods;
}
}
}